﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class Periodos : Form
    {
        #region Propriedades e Variáveis

        BLL.Periodo Periodo = new BLL.Periodo();
        BLL.PeriodoAno PeriodoAno = new BLL.PeriodoAno();

        int PeriodoAnoAtivo;
        int ProximoPeriodoAno;

        //Lista para armazenar os objetos apresentados na interface
        List<BLL.Periodo.Lista> ListaPeriodos;

        #endregion

        #region Construtor

        public Periodos(int pAnoPeriodo)
        {
            try
            {
                InitializeComponent();
                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                PeriodoAnoAtivo = pAnoPeriodo;
                InicializaPeriodos();
                InicializaNovoAno();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public Periodos()
        {
            throw new Exception("Informe o Ano para inicializar a interface");
        }

        #endregion Construtor

        #region Eventos

        private void btnEncerrarPeriodo_Click(object sender, EventArgs e)
        {
            try
            {
                Periodo.EncerrarPeriodoAtivo();
                if (MesAtivo == 12)
                {
                    InicializaNovoAno();
                    PeriodoAnoAtivo++;
                }
                InicializaPeriodos();


                OnChangeActivePeriod(this, new EventArgs());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);;
            }
        }

        private void btnNovoAno_Click(object sender, EventArgs e)
        {
            try
            {
                PeriodoAno.NovoPeriodoAno(ProximoPeriodoAno);
                InicializaNovoAno();

                OnCreateNewYear(this, new EventArgs());
                MessageBox.Show("Exercício " + (ProximoPeriodoAno - 1) + " gerado com sucesso");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Eventos

        #region Métodos Publicos

        private void InicializaNovoAno()
        {
            ProximoPeriodoAno = (PeriodoAno.UltimoPeriodoAnoCadastrado() + 1);
            btnNovoAno.Text = "Novo Exercício (" + ProximoPeriodoAno.ToString() + ")";
        }

        private int MesAtivo = 0;
        private void InicializaPeriodos()
        {
            bool PrimeiroPeriodoAtivo = false;
            BLL.Periodo.Lista periodo = null;

            grpExercicio.Text = "Ano de fechamento " + PeriodoAnoAtivo;
            
            ListaPeriodos = Periodo.GetLista(new BLL.Periodo.Lista() { AnoPeriodo = PeriodoAnoAtivo });

            //Janeiro
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 1).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtJaneiro.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtJaneiro.PeriodoAtivo();
            else
            {
                txtJaneiro.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 1;
            }

            //Fevereiro
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 2).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtFevereiro.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtFevereiro.PeriodoAtivo();
            else
            {
                txtFevereiro.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 2;
            }

            //Março
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 3).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtMarco.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtMarco.PeriodoAtivo();
            else
            {
                txtMarco.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 3;
            }

            //Abril
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 4).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtAbril.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtAbril.PeriodoAtivo();
            else
            {
                txtAbril.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 4;
            }

            //Maio
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 5).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtMaio.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtMaio.PeriodoAtivo();
            else
            {
                txtMaio.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 5;
            }

            //Junho
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 6).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtJunho.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtJunho.PeriodoAtivo();
            else
            {
                txtJunho.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 6;
            }

            //Julho
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 7).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtJulho.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtJulho.PeriodoAtivo();
            else
            {
                txtJulho.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 7;
            }

            //Agosto
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 8).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtAgosto.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtAgosto.PeriodoAtivo();
            else
            {
                txtAgosto.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 8;
            }

            //Setembro
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 9).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtSetembro.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtSetembro.PeriodoAtivo();
            else
            {
                txtSetembro.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 9;
            }

            //Outubro
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 10).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtOutubro.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtOutubro.PeriodoAtivo();
            else
            {
                txtOutubro.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 10;
            }

            //Novembro
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 11).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtNovembro.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtNovembro.PeriodoAtivo();
            else
            {
                txtNovembro.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 11;
            }

            //Dezembro
            periodo = ListaPeriodos.Where(w => w.MesPeriodo == 12).Select(s => s).First();
            if (periodo != null && periodo.IndicaPeriodoFechado == true)
                txtDezembro.PeriodoFechado();
            else if (PrimeiroPeriodoAtivo)
                txtDezembro.PeriodoAtivo();
            else
            {
                txtDezembro.PeriodoAtual();
                PrimeiroPeriodoAtivo = true;
                MesAtivo = 12;
            }
        }
        
        public event EventHandler OnChangeActivePeriod;
        public event EventHandler OnCreateNewYear;
        #endregion Métodos Publicos
    }

    public static class Extensoes
    {
        public static void PeriodoFechado(this TextBox pTextbox)
        {
            pTextbox.BackColor = Color.Gray;
            pTextbox.ForeColor = Color.White;
        }

        public static void PeriodoAtivo(this TextBox pTextbox)
        {
            pTextbox.BackColor = Color.WhiteSmoke;
            pTextbox.ForeColor = Color.Black;
        }

        public static void PeriodoAtual(this TextBox pTextbox)
        {
            pTextbox.BackColor = Color.Green;
            pTextbox.ForeColor = Color.White;
        }
    }
}